# 导入必要的组件
import os
from local_utils import tools_info, tools_mapping  # 导入自定义工具配置
from planning import process_user_input  # 导入planning模块中的处理函数
from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from langserve import add_routes
from pydantic import BaseModel
import uvicorn
from typing import Dict, Any
from langchain_core.runnables import RunnableLambda

# 创建FastAPI应用实例
app = FastAPI(title="Agent API", description="聊天机器人智能应用")

# 定义请求模型
class UserInput(BaseModel):
    input: str

# 定义响应模型
class AgentResponse(BaseModel):
    reply: str
    process_results: list = []

# 处理函数
def process_agent(input: Dict[str, Any]) -> Dict[str, Any]:
    """
    处理用户输入并返回智能代理的响应。

    Args:
        input (Dict[str, Any]): 包含用户输入的字典，必须包含 "input" 键，值为用户输入的文本字符串。

    Returns:
        Dict[str, Any]: 包含以下键的响应字典：
            - reply (str): 智能代理的回复文本
            - process_results (list): 处理过程中的中间结果列表

    Raises:
        HTTPException: 当处理过程中发生错误时抛出，状态码为500，错误详情包含具体错误信息。
    """
    try:
        result = process_user_input(
            user_input=input["input"],
            tools_info=tools_info,
            tools_mapping=tools_mapping,
            print_process=False
        )
        return {
            "reply": result["reply"],
            "process_results": result.get("process_results", [])
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# 将处理函数转换为 Runnable
agent_runnable = RunnableLambda(process_agent)

# 使用 LangServe 添加路由
add_routes(
    app,
    agent_runnable,
    path="/process",
    input_type=UserInput,
    output_type=AgentResponse,
)

# 主程序入口
if __name__ == "__main__":
    # 启动服务器
    uvicorn.run(app, host="localhost", port=8000)  